import logging
import os
import sys

# entity2.py
from sqlalchemy import Column, String, Float, Integer, create_engine, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlmodel import Session

from core.util.web007util import Spider007Util

Base = declarative_base()

def get_base_dir():
    if getattr(sys, 'frozen', False):
        return os.path.dirname(sys.executable)
    return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

BASE_DIR = get_base_dir()
db_dir = os.path.join(BASE_DIR, "sqlite")
if not os.path.exists(db_dir):
    os.makedirs(db_dir)

db_path = os.path.join(db_dir, "test.db")

# 数据库配置
sqlite_db_location = f"sqlite:///{db_path}"
logging.info(f"初始化数据库连接：{sqlite_db_location}")
engine = create_engine(sqlite_db_location, connect_args={"check_same_thread": False})  # 使用SQLite数据库，路径为相对路径
engine.echo = True  # 输出SQL语句
Base.metadata.create_all(engine)  # 会自动关联现有表

class MatchDataV2(Base):
    __tablename__ = 'match_data_v2'

    id = Column(Integer, primary_key=True)
    
    # 基础比赛信息
    比赛ID = Column(String)
    颜色 = Column(String)
    联赛名_简体 = Column(String)
    联赛名_繁体 = Column(String)
    主队名_简体 = Column(String)
    主队名_繁体 = Column(String)
    客队名_简体 = Column(String)
    客队名_繁体 = Column(String)
    比赛时间 = Column(String)
    比赛日期时间 = Column(String)
    
    # 比赛状态和比分
    比赛状态 = Column(Integer)  # -1:已结束, 0:未开始, 1:上半场, 2:中场休息, 3:下半场, 4:取消, 5:推迟
    主队比分 = Column(Integer)
    客队比分 = Column(Integer)
    主队半场比分 = Column(Integer)
    客队半场比分 = Column(Integer)

    # 红黄牌和角球信息
    主队红牌 = Column(Integer, default=0)
    客队红牌 = Column(Integer, default=0)
    主队黄牌 = Column(Integer, default=0)
    客队黄牌 = Column(Integer, default=0)
    主队角球 = Column(Integer, default=0)
    客队角球 = Column(Integer, default=0)

    # 联赛和球队排名信息
    主队排名 = Column(String)
    客队排名 = Column(String)
    是否中立场地 = Column(Boolean)
    是否热门 = Column(Boolean)
    是否走地 = Column(Boolean, default=False)
    是否有直播 = Column(Boolean)
    让球数 = Column(Float)
    说明 = Column(String)
    
    # 分析推荐信息
    分析推荐 = Column(String)
    
    # 联赛和国家信息
    联赛ID = Column(String)
    SCLASS_ID = Column(String)
    国家ID = Column(String)
    国家名_简体 = Column(String)
    国家名_繁体 = Column(String)

    def __str__(self):
        return f"MatchDataV2(比赛ID={self.比赛ID}, 联赛={self.联赛名_简体}, " \
               f"主队={self.主队名_简体}, 客队={self.客队名_简体}, " \
               f"比分={self.主队比分}-{self.客队比分}, 比赛日期时间={self.比赛日期时间})，比赛状态={Spider007Util.get_match_status_text(self.比赛状态)}"

# 确保在类定义之后创建表
Base.metadata.create_all(engine)

def create_match_v2(match_data: MatchDataV2):
    """创建新比赛数据"""
    with Session(engine) as session:
        session.add(match_data)
        session.commit()
        session.refresh(match_data)
        return match_data


def bulk_save_matches(matches: list[MatchDataV2]):
    """批量保存比赛数据 (Upsert: 如果存在则更新，否则插入)"""
    if not matches:
        return
        
    with Session(engine) as session:
        for match in matches:
            # 简单查重：假设比赛ID唯一
            existing = session.query(MatchDataV2).filter(MatchDataV2.比赛ID == match.比赛ID).first()
            if existing:
                # 更新现有记录的关键字段
                existing.比赛状态 = match.比赛状态
                existing.主队比分 = match.主队比分
                existing.客队比分 = match.客队比分
                existing.主队半场比分 = match.主队半场比分
                existing.客队半场比分 = match.客队半场比分
                existing.主队红牌 = match.主队红牌
                existing.客队红牌 = match.客队红牌
                existing.主队黄牌 = match.主队黄牌
                existing.客队黄牌 = match.客队黄牌
                existing.主队角球 = match.主队角球
                existing.客队角球 = match.客队角球
                existing.让球数 = match.让球数
                existing.说明 = match.说明
                existing.比赛时间 = match.比赛时间 # 时间可能变更
                existing.是否有直播 = match.是否有直播
                # 其他静态字段通常不变，暂不更新以节省开销
            else:
                session.add(match)
        session.commit()


def get_all_match_data_v2():
    """查询所有比赛数据"""
    with Session(engine) as session:
        statement = MatchDataV2.__table__.select()
        results = session.execute(statement).fetchall()
        return results

if __name__ == '__main__':
    # 示例数据
    match_data = MatchDataV2(
        比赛ID="2894086",
        颜色="#1ba578",
        联赛名_简体="印尼甲",
        联赛名_繁体="印尼甲",
        主队名_简体="苏姆塞尔联",
        主队名_繁体="苏姆塞尔联",
        客队名_简体="佩斯卡德",
        客队名_繁体="佩斯卡德",
        比赛时间="20:00",
        比赛日期时间="2025,10,13,21,32,20",
        比赛状态=0,
        主队比分=0,
        客队比分=0,
        主队半场比分=0,
        客队半场比分=0,
        主队排名="",
        客队排名="",
        是否中立场地=False,
        是否热门=False,
        是否有直播=False,
        让球数=0.0,
        分析推荐="析亚大欧荐"
    )

    create_match_v2(match_data)
